From: Shanker Donthineni Date: Wed, 20 Jul 2016 14:00:54 +0000 (-0500) Subject: xen: Add generic implementation of binary search X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~699 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:///%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:/?a=commitdiff_plain;h=e3eb84e33c365ce0af1a75ef25ec36cf646c958b;p=xen.git xen: Add generic implementation of binary search This patch adds the generic implementation of binary search algorithm which is copied from Linux kernel v4.7-rc7. No functional changes. Signed-off-by: Shanker Donthineni Reviewed-by: Andrew Cooper Reviewed-by: Julien Grall --- diff --git a/xen/common/Makefile b/xen/common/Makefile index dbf00c639d..f8123c27de 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -43,6 +43,7 @@ obj-y += schedule.o obj-y += shutdown.o obj-y += softirq.o obj-y += sort.o +obj-y += bsearch.o obj-y += smp.o obj-y += spinlock.o obj-y += stop_machine.o diff --git a/xen/common/bsearch.c b/xen/common/bsearch.c new file mode 100644 index 0000000000..7090930aab --- /dev/null +++ b/xen/common/bsearch.c @@ -0,0 +1,51 @@ +/* + * A generic implementation of binary search for the Linux kernel + * + * Copyright (C) 2008-2009 Ksplice, Inc. + * Author: Tim Abbott + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2. + */ + +#include + +/* + * bsearch - binary search an array of elements + * @key: pointer to item being searched for + * @base: pointer to first element to search + * @num: number of elements + * @size: size of each element + * @cmp: pointer to comparison function + * + * This function does a binary search on the given array. The + * contents of the array should already be in ascending sorted order + * under the provided comparison function. + * + * Note that the key need not have the same type as the elements in + * the array, e.g. key could be a string and the comparison function + * could compare the string with the struct's name field. However, if + * the key and elements in the array are of the same type, you can use + * the same comparison function for both sort() and bsearch(). + */ +void *bsearch(const void *key, const void *base, size_t num, size_t size, + int (*cmp)(const void *key, const void *elt)) +{ + size_t start = 0, end = num; + int result; + + while (start < end) { + size_t mid = start + (end - start) / 2; + + result = cmp(key, base + mid * size); + if (result < 0) + end = mid; + else if (result > 0) + start = mid + 1; + else + return (void *)base + mid * size; + } + + return NULL; +} diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index b1b0fb2c17..5272cc3a7e 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -153,4 +153,7 @@ void dump_execstate(struct cpu_user_regs *); void init_constructors(void); +void *bsearch(const void *key, const void *base, size_t num, size_t size, + int (*cmp)(const void *key, const void *elt)); + #endif /* __LIB_H__ */